from lxml import etree

html = '''
<html lang="zh">
    <head>
      <meta charset="UTF-8">
      <title>示例网页</title>
    </head>
    <body>
      <h1>欢迎来到我的网站</h1>
      <p>这是一个简单的HTML页面，用于演示XPath解析。</p>
      <ul>
        <li><a href="https://www.example.com/page1">链接1</a></li>
        <li><a href="https://www.example.com/page2">链接2</a></li>
        <li><a href="https://www.example.com/page3">链接3</a></li>
      </ul>
      <div id="content">
        <h2>内容标题</h2>
        <p>这是一段内容。</p>
        <p>这是另一段内容。</p>
      </div>
    </body>
</html>
'''

tree = etree.HTML(html)
## 从根节点选取
data1 = tree.xpath('/html')
print('从根节点选取:',data1)
## 取head下title的值
data2 = tree.xpath('/html/head/title/text()')
print('取head下title的值:',data2)
## 取子孙节点值
data3 = tree.xpath('//p/text()')
print('取子孙节点值为：',data3)

## 选取当前节点值
all_p = tree.xpath('//p')
for p in all_p:
    print('选取当前节点：',p.xpath('.')) # 获取值话：./text()
    print('选取当前节点父节点：',p.xpath('..'))

## 获取html,lang属性
attr = tree.xpath('/html/@lang')
print('获取html,lang属性:',attr)
## 获取所有href的属性
href = tree.xpath('//@href')
print('获取所有href的属性:',href)

## 选取属于ul子元素的第一个li元素的a 值 ,这里从 1 开始
print('选取属于ul子元素的第一个li元素a值:',tree.xpath('/html/body/ul/li[1]/a/text()'))

## 选取属于ul子元素的最后一个li元素的a 值
print('选取属于ul子元素的最后一个li元素a值:',tree.xpath('/html/body/ul/li[last()]/a/text()'))

## 选取属于ul子元素的倒数第二个li元素的a 值
print('选取属于ul子元素的最后一个li元素a值:',tree.xpath('/html/body/ul/li[last()-1]/a/text()'))

## 选取所有拥有名为 href 的属性的 a 元素。
print('选取所有拥有名为 href 的属性的 a 元素:',tree.xpath('//a[@href]'))

## 选取所有拥有名为 id=content 的属性的 div 元素。
print('选取所有拥有名为 id=content 的属性的 div 元素:',tree.xpath('//div[@id="content"]'))

## 选取 ul 元素的所有 li 元素，且其中的 a 元素的值须为 链接2,如果是数值可以比大小运算。
print('选取 ul 元素的所有 li 元素，且其中的 a 元素的值须为 链接2:',tree.xpath('/html/body/ul/li[a="链接2"]'))


## 选取 html 元素的所有子元素
print('选取 html 元素的所有子元素:',tree.xpath('/html/*'))

## 选取文档中的所有元素
print('选取文档中的所有元素:',tree.xpath('//*'))

## 选取所有带有属性的 a 元素
print('选取所有带有属性的 a 元素:',tree.xpath('//a[@*]'))

## 选取 body 元素的所有 h1 和 p 元素
print('选取 body 元素的所有 h1 和 p 元素:',tree.xpath('//body/h1 | //body/p'))

## 选取文档中的所有 h1 和 p 元素
print('选取文档中的所有 h1 和 p 元素:',tree.xpath('//h1 | //p'))

